#include <iostream>
#include <cstring>

#include "Administrador.h"

using namespace std;

int main() {
	int opt1, opt2, opt3;

	char dni[8], dniPaciente[8], dolencia[200], receta[500];
	char nombre[50];
	int edad;
	char direccion[120];
	char dniSupervisor[8];
	int turno;

	Administrador adm;
	Doctor doctor;
	Paciente paciente;
	Consulta consulta;

	do {
		cout << "Ingrese el numero de su opcion" << endl;
		cout << "[1]Supervisor" << endl;
		cout << "[2]Doctor" << endl;
		cout << "[3]Registrar Paciente" << endl;
		cout << "[4]Salir" << endl;
		cin >> opt1;
		cin.ignore(1);
		switch (opt1) {
		case 1:
			do {
				cout << "Ingrese el numero de su opcion" << endl;
				cout << "[1]Registrar Doctor" << endl;
				cout << "[2]Cambiar Supervisor" << endl;
				cout << "[3]Cambiar turno" << endl;
				cout << "[4]Reportes" << endl;
				cout << "[5]Regresar al menu anterior" << endl;

				cin >> opt2;
				cin.ignore(1);

				switch (opt2) {
				case 1: {
					ifstream fDoc("Doctores.dat");
					cout << "Ingrese DNI: ";
					cin.getline(dni, 8);

					cout << "Ingrese Nombre y Apellidos: ";
					cin.getline(nombre, 50);

					cout << "Ingrese Edad: ";
					cin >> edad;
					cin.ignore(1);

					cout << "Ingrese direccion: ";
					cin.getline(direccion, 120);

					cout << "Ingrese turno" << endl;
					cout << "[1]Manana" << endl;
					cout << "[2]Tarde" << endl;
					cout << "[3]Noche" << endl;
					cin >> turno;
					cin.ignore(1);

					if (adm.BuscarSupervisor(turno) == NULL) {
						adm.AgregarDoctor(dni, nombre, edad, direccion, turno,
								dni);
					} else {
						adm.AgregarDoctor(dni, nombre, edad, direccion, turno,
								adm.BuscarSupervisor(turno)->dni);
					}
					break;
				}
				case 2: {
					cout << "Ingrese turno" << endl;
					cout << "[1]Manana" << endl;
					cout << "[2]Tarde" << endl;
					cout << "[3]Noche" << endl;
					cin >> turno;
					cin.ignore(1);

					cout << "Ingrese DNI del nuevo supervisor: ";
					cin.getline(dniSupervisor, 8);
					Doctor *d=adm.BuscarDoctor(dni);

					if (d != NULL ) {
						if(d->turno==turno)
						{
						adm.CambiarSupervisor(dni, turno);
						}
						else
						{
							cout << "El turno del doctor no coincide con el turno que va a supervisar" << endl;
						}
					} else {
						cout << "El DNI no esta registrado" << endl;
					}

					break;
				}
				case 3: {
					cout << "Ingrese DNI: ";
					cin.getline(dni, 8);

					cout << "Ingrese turno: " << endl;
					cout << "[1]Manana" << endl;
					cout << "[2]Tarde" << endl;
					cout << "[3]Noche" << endl;
					cin >> turno;
					cin.ignore(1);

					if (adm.BuscarDoctor(dni) != NULL) {
						adm.CambiarTurno(dni, turno);
					} else {
						cout << "El DNI no esta registrado" << endl;
					}
					break;
				}
				case 4: {

					cout << "Ingrese DNI de supervisor: ";
					cin.getline(dniSupervisor, 8);

					cout << "Ingrese turno" << endl;
					cout << "[1]Manana" << endl;
					cout << "[2]Tarde" << endl;
					cout << "[3]Noche" << endl;
					cin >> turno;
					cin.ignore(1);

					Doctor *d = adm.BuscarSupervisor(turno);

					if (d != NULL && strcmp(d->dni, dniSupervisor) == 0) {
						do {
							cout << "Ingrese el numero de su opcion" << endl;
							cout
									<< "[1]Reporte de todos los doctores en un mes."
									<< endl;
							cout
									<< "[2]Reporte de la historia médica de un paciente."
									<< endl;
							cout
									<< "[3]Reporte con información del numero de atenciones medicas de cada doctor"
									<< endl;
							cout << "[4]Regresar al menu anterior" << endl;

							cin >> opt3;
							cin.ignore(1);

							switch (opt3) {
							case 1:
								adm.Reporte1();
								break;
							case 2:
								cout << "Ingrese DNI del paciente: ";
								cin.getline(dniPaciente, 8);

								adm.Reporte2(turno, dniPaciente);
								break;
							case 3:
								adm.Reporte3(turno);
								break;
							case 4:
								break;
							default:
								break;
							}
						} while (opt3 != 4);
					} else {
						cout
								<< "No crresponde el DNI aun supervisor o no es el turno"
								<< endl;
					}
				}
				case 5:
					break;
				default: {
					cout << "Opcion invalida" << endl;
					break;
				}
				}
			} while (opt2 != 5);
			break;
		case 2:
			do {
				cout << "Ingrese el numero de su opcion" << endl;
				cout << "[1]Ver Historia Clinica de Paciente" << endl;
				cout << "[2]Registrar Consulta" << endl;
				cout << "[3]Regresar al menu anterior" << endl;
				cin >> opt2;
				cin.ignore(1);

				switch (opt2) {
				case 1:
					cout << "Ingrese DNI de paciente: ";
					cin.getline(dniPaciente, 8);

					if (adm.BuscarPaciente(dniPaciente) != NULL) {
						adm.RecuperarHistoriaClinica(dniPaciente);
					} else {
						cout << "El DNI no corresponde a un Paciente" << endl;
					}
					break;
				case 2:
					cout << "Ingrese DNI del Doctor: ";
					cin.getline(dni, 8);

					if (adm.BuscarDoctor(dni) != NULL) {
						cout << "Ingrese DNI del Paciente: ";
						cin.getline(dniPaciente, 8);

						if (adm.BuscarPaciente(dniPaciente) != NULL) {
							cout << "Ingrese la dolencia del paciente: ";
							cin.getline(dolencia, 200);

							cout << "Ingrese detalle de la receta: ";
							cin.getline(receta, 500);
							adm.GuardarConsulta(dni, dniPaciente, dolencia,
									receta);
						} else {
							cout << "El DNI no corresponde a un Paciente"
									<< endl;
						}
					} else {
						cout << "El DNI no corresponde a un Doctor" << endl;
					}
					cout << endl;
					break;
				case 3:
					break;
				default:
					cout << "Opcion invalida" << endl;
					break;
				}
			} while (opt2 != 3);
			break;
		case 3:
			cout << "Ingrese DNI: ";
			cin.getline(dni, 8);

			cout << "Ingrese Nombre y Apellidos: ";
			cin.getline(nombre, 50);

			cout << "Ingrese Edad: ";
			cin >> edad;
			cin.ignore(1);

			cout << "Ingrese direccion: ";
			cin.getline(direccion, 120);

			adm.AgregarPaciente(dni, nombre, edad, direccion);
			break;
		case 4:
			break;
		default:
			cout << "Opcion invalida" << endl;
			break;
		}
	} while (opt1 != 4);

	return 0;
}
